<?php
/**
 * 添加一条导航菜单
 * @version 1.0.0 首次引入
 * @param array $post 必需;数组格式,支持的字段列表请参考手册
 * @return mixed 成功时返回obj,失败时null
 */
function navbarSave($post=[])
{
    $post = DcArrayArgs($post,[
        'term_type'     => 'navs',
        'term_module'   => 'navbar',
        'term_controll' => 'detail',
        'term_action'   => 'navbar',//默认导航栏
    ]);
    
    config('common.validate_name', 'navbar/Common');
        
    config('common.validate_scene', 'save');

    config('common.where_slug_unique', ['term_type'=>['eq','navs']]);
    
    return \daicuo\Term::save($post);
}

/**
 * 删除一条或多条导航菜单
 * @version 1.0.0 首次引入
 * @param mixed $ids 必需;多个用逗号分隔或使用数组传入(array|string);默认：空 
 * @return array ID作为键名,键值为删除结果(bool)
 */
function navbarDelete($ids=[])
{
    return \daicuo\Term::delete_ids($ids);
}

/**
 * 修改一条导航菜单(需传入主键值作为更新条件)
 * @version 1.0.0 首次引入
 * @param array $post 必需;数组格式,支持的字段列表请参考手册 {
 *     @type int $term_id 必需;按ID修改;默认：空
 * }
 * @return mixed 成功时返回obj,失败时null
 */
function navbarUpdate($post=[])
{
    $post = DcArrayArgs($post,[
        'term_type'     => 'navs',
        'term_module'   => 'navbar',
        'term_controll' => 'detail',
        'term_action'   => 'navbar',//默认导航栏
    ]);
    
    config('common.validate_name', 'navbar/Common');
        
    config('common.validate_scene', 'update');

    config('common.where_slug_unique', ['term_type'=>['eq','navs']]);
    
    return \daicuo\Term::update_id($post['term_id'], $post);
}

/**
 * 按条件查询一条导航菜单
 * @version 1.0.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type mixed $id 可选;内容ID(stirng|array);默认：空
 *     @type mixed $name 可选;内容名称(stirng|array);默认：空
 *     @type mixed $slug 可选;内容别名(stirng|array);默认：空
 *     @type mixed $title 可选;内容别名(stirng|array);默认：空
 *     @type mixed $user_id 可选;用户ID(stirng|array);默认：空
 *     @type array $with 可选;自定义关联查询条件;默认：空
 *     @type array $view 可选;自定义视图查询条件;默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return array 查询结果
 */
function navbarGet($args=[])
{
    $args = DcArrayArgs($args,[
        'cache'    => true,
        'type'     => 'navs',
        'with'     => 'term_meta',
    ]);
    
    $args = DcArrayEmpty($args);
    
    return \daicuo\Term::meta_attr( DcTermFind($args) );
}

/**
 * 按条件获取导航菜单列表
 * @version 1.0.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：true
 *     @type string $limit 可选;数据限制(分页时为每一页);默认：空
 *     @type string $page 可选;分页页码(不填则不分页);默认：空
 *     @type string $result 可选;返回状态(array|tree|level);默认：tree
 *     @type string $sort 可选;排序字段名(term_id|term_order|term_count);默认：term_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;模型名称;默认：空
 *     @type string $controll 可选;控制器名称;默认：空
 *     @type string $action 可选;操作名称(navbar|sitebar|navs|links|ico|image|other);默认：空
 *     @type array $where 可选;自定义高级查询条件;默认：空
 * }
 * @return mixed 查询结果obj|null
 */
function navbarSelect($args=[])
{
    //手动处理返回结果
    $result = DcEmpty($args['result'], 'tree');
    unset($args['result']);
    //默认参数(固定返回Array)
    $args = DcArrayArgs($args,[
        'cache'  => true,
        'type'   => 'navs',
        'result' => 'array',
        'sort'   => 'term_order',
        'order'  => 'desc',
        'action' => 'navbar',
    ]);
    //查询导航栏标识时不同的查询方法（需合并分类的导航栏属性）
    if($args['action'] == 'navbar'){
        $args = DcArrayArgs([
            'field'      => '',
            'group'      => 'term.term_id',
            'view'       => [
                ['term', '*'],
                ['term_meta', NULL, 'term_meta.term_id=term.term_id']
            ],
            'whereOr'    => [
                0 => 'term_status="normal" AND term_type="category" AND term_meta_key="term_navbar" AND term_meta_value="yes"',
            ],
        ],$args);
    }
    //字段映射
    $navs = [];
    //调用查询接口后进行字段映射转换器
    foreach(DcTermSelect($args) as $key=>$value){
        $navs[$key] = navbarDataGet($value);
    }
    //树形结构
    if($result == 'tree' && $navs){
        return list_to_tree($navs, 'navs_id', 'navs_parent');
    }
    //还原层级
    if($result == 'level' && $items){
        return tree_to_level(list_to_tree($items, 'navs_id', 'navs_parent'), 'navs_name');
    }
    //普通数组
    return $navs;
}

/**
 * 按ID快速获取一条导航菜单
 * @version 1.0.0 首次引入
 * @param int $value 必需;Id值；默认：空
 * @param bool $cache 可选;是否缓存;默认：true
 * @param string $status 可选;数据状态;默认：空
 * @return mixed 查询结果(obj|null)
 */
function navbarId($value='', $cache=true, $status='')
{
    if (!$value) {
        return null;
    }
    return navbarGet([
        'id'     => $value,
        'cache'  => $cache,
        'status' => $status,
    ]);
}

/**
 * 按别名获取一条导航菜单
 * @version 1.0.0 首次引入
 * @param string $value 必需;别名值；默认：空
 * @param bool $cache 可选;是否缓存;默认：true
 * @param string $status 可选;数据状态;默认：空
 * @return mixed 查询结果(obj|null)
 */
function navbarSlug($value='', $cache=true, $status='')
{
    if (!$value) {
        return null;
    }
    return navbarGet([
        'slug'   => $value,
        'cache'  => $cache,
        'status' => $status,
    ]);
}

/**
 * 导航菜单数据获取器
 * @version 1.0.0 首次引入
 * @param array $data 必需;数组格式,支持的字段列表请参考手册;默认:空
 * @return array 处理后的数据
 */
function navbarDataGet($data=[]){
    //链接处理
    if($data){
        $data['term_link'] = navbarUrl($data);
    }
    //字段映射
    $navs = [];
    foreach($data as $key=>$value){
        $navs[str_replace('term_','navs_',$key)] = $value;
    }
    return $navs;
}

/**
 * 获取菜单select关系
 * @version 1.0.0 首次引入
 * @param array $args 必需;查询条件数组格式 {
 *     @type bool $cache 可选;是否缓存;默认：false
 *     @type string $sort 可选;排序字段名(term_id|term_parent|term_order|trem_count);默认：term_order
 *     @type string $order 可选;排序方式(asc|desc);默认：asc
 *     @type string $search 可选;搜索关键词（名称与别名）;默认：空
 *     @type string $status 可选;显示状态（normal|hidden）;默认：空
 *     @type string $module 可选;队列类型(stirng|array),固定范围(category|tag|navs);默认：navs
 *     @type string $parent 可选;父级ID(int|array);默认：空
 * }
 * @return mixed 查询结果(array|null)
 */
function navbarOption($args=[]){
    $args = DcArrayArgs($args,[
        'type'       => 'navs',
        'fieldKey'   => 'term_id',
        'fieldValue' => 'term_name',
        'isSelect'   => true,
        'status'     => '',
    ]);
    return \daicuo\Term::Option($args);
}

/**
 * 获取导航菜单应用插件所有字段
 * @version 1.0.0 首次引入
 * @return mixed 成功时返回array,失败时null
 */
function navbarFields()
{
    $fields = array_keys(DcFields('term'));
    $fieldsMeta = array_keys(DcFields(config('custom_fields.term_meta')));
    if(is_array($fields) && is_array($fieldsMeta)){
        return array_merge($fields, $fieldsMeta);
    }
    return null;
}

/**
 * 获取导航栏链接
 * @version 1.1.0 首次引入
 * @param array $term 必需;队例数组;默认：空
 * @return string 转换后的链接
 */
function navbarUrl($term='', $pageNumber=''){
    //优先检测是否有自定义导航菜单链接
    if($term['navs_url']){
        return navbarUrlParse($term['navs_url']);
    }
    //未定义插件应用名禁用链接
    if(!$term['term_module']){
        return 'javascript:;';
    }
    //导航菜单插件时返回禁用链接（未定义导航链接）
    if($term['term_module'] == 'navbar'){
        return 'javascript:;';
    }
    //查找应用插件是否有定义分类页伪静态规则（需按此规则扩展）
    $route  = config($term['term_module'].'.rewrite_category');
    //伪静态链接参数
    $args = [];
    //拼音/名称/ID
    if( preg_match('/:slug|<slug/i',$route) ){
        $args['slug'] = $term['term_slug'];
    }
    if( preg_match('/:id|<id/i',$route) ){
        $args['id'] = $term['term_id'];
    }
    if( preg_match('/:name|<name/i',$route) ){
        $args['name'] = $term['term_name'];
    }
    //默认ID
    if(!$args){
        $args['id'] = $term['term_id'];
    }
    if($pageNumber){
        $args['pageNumber'] = $pageNumber;
    }
    return DcUrl($term['term_module'].'/category/index', $args);
}

/**
 * 内部模块链接与外部网址链接格式化
 * @version 1.0.0 首次引入
 * @param string $url 必需;待验证的网址;默认：空
 * @return string 转换后的链接
 */
function navbarUrlParse($url='')
{
    //默认值
    $url = DcEmpty($url, 'navbar/index/index');
    //分解地址栏参数
    $array = parse_url($url);
    if($array['scheme']){
        return $url;
    }
    //内部链接
    return DcUrl($array['path'], $array['query']);
}